﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 单例模式
{
    /// <summary>
    /// 私有化构造函数
    /// 私有的静态变量
    /// 一个静态的对象创建方法 
    /// 保证了整表进程中该对象只被实例化一次， 
    /// 常驻内存
    /// 
    /// 普通的类型是需要的时候就 初始化，用完被GC回收
    /// </summary>
   public class Singleton
    {
        private Singleton()
        {
            Thread.Sleep(1000); //耗时
            string bigSize = "占用10M内存"; //耗计算资源
            string resource = "占用多个线程和数据库连接资源"; //耗额限资源
            Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }

        private static Singleton _Singleton = null; //静态对象全局只有一个实例

        private static readonly object Singleton_Lock = new object(); //建议用这种
        public static Singleton CreateInstance() //创建对象 标准单例模式
        {
            if (_Singleton == null)//保证为空才进去，这样可以提高性能
            {
                lock (Singleton_Lock) //保证只有一个线程进去判断
                {
                    if (_Singleton == null) //保证为空才真的创建
                    {
                        _Singleton = new Singleton();
                    }

                }
            }
          
            return _Singleton;
        }

        public void Show()
        {
            Console.WriteLine("这礼调用了{0}.Show",this.GetType().Name);
        }
    }
}
